快速开发:快速实现一个智能充电柜(智能锁)
常用的JS调用Java代码的方法,主要包括以下三种:
1)通过WebView的addJavascriptInterface进行对象映射
2)通过 WebViewClient 的shouldOverrideUrlLoading方法回调拦截 url
3) 通过 WebChromeClient 的onJsAlert、onJsConfirm、onJsPrompt方法回调拦截JS对话框alert、confirm、prompt 消息
原生渲染
本地开发的web 页面,构建形成 Weex 的一个 JS bundle(native);在云端,开发者可以把生成的 JS bundle 部署上去,然后通过网络请求或预下发的方式传递到用户的移动应用客户端;在移动应用客户端里,WeexSDK 会准备好一个 JavaScript 引擎,并且在用户打开一个 Weex 页面时执行相应的 JS bundle,并在执行过程中产生各种命令发送到 native 端进行的界面渲染或数据存储、网络通信、调用设备功能、用户交互响应等移动应用的场景实践。
1、Weex 的 iOS 和 Android 客户端中都会运行一个 JavaScript 引擎,来执行 JS bundle。
2、Weex向各端的渲染层发送规范化的指令,调度客户端的native渲染和其它各种能力。
3、我们在 iOS 下选择了 JavaScriptCore 内核,而在 Android 下选择了 UC 提供的 v8 内核。
原理:
1、将XML+CSS+JavaScript代码转换为JSBundle
2、JSBundle传给JS Framework解析为Json格式的Virtual DOM
3、客户端通过接收Virtual DOM渲染界面
vue示例
<template>
<view class="content">
<text> {{speedWarnInfo}} </text>
<view class="log">
<view v-for="(log,index) in logs" class="" :key="index">
{{log}}
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
logs: [],
speed: 0,
speedWarnInfo: ''
}
},
watch: {
speed: {
handler(val) {
if (val > 100) {
this.speedWarnInfo = "超速"
}
},
immediate: true
}
},
beforeCreate:function(){
// 实例完全被创建出来之前,vue 实例的挂载元素$el和数据对象 data 都为 undefined,还未初始化
},
created:function(){
// 数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el 未存在 。
this.connect()
},
beforeMount:function(){
// vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中。data.message 未替换
},
mounted:function(){
// vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了。
},
updated:function(){
// 当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。
},
beforeUpdate:function(){
// 当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。
},
beforeDestroy:function(){
// 组件销毁之前调用 ,在这一步,实例仍然完全可用。
},
destroyed:function(){
// 组件销毁之后调用,对 data 的改变不会再触发周期函数,vue 实例已解除事件监听和 dom绑定,但 dom 结构依然存在。
},
methods: {
connect() {
var self = this
self.logs.push('connect')
var mqtt = require('mqtt/dist/mqtt.js')
// #ifdef H5
var client = mqtt.connect('xx://xxx.xxxxxx:8080')
// #endif
// #ifdef MP-WEIXIN||APP-PLUS
var client = mqtt.connect('xx://xxx.xxxxxx:8080')
// #endif
client.on('connect', function() {
self.logs.push('on connect')
client.subscribe('presence', function(err) {
if (!err) {
client.publish('presence', 'hello')
}
})
}).on('reconnect', function() {
self.logs.push('on reconnect')
}).on('error', function() {
self.logs.push('on error')
}).on('end', function() {
self.logs.push('on end')
}).on('message', function(topic, message) {
console.log(message)
self.logs.push(message.toString())
})
}
}
}
</script>
<style>
.content {
text-align: center;
height: 400upx;
word-break: break-all;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
后端通信协议
协议就是通信双方的一个约定,即,表示第1位传输的什么、第2位传输的什么
有哪些协议可用
长链接:mqtt,Jt808,Tcp,http
短链接:coap,http
短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接
JT808
消息ID(0-1) 消息体属性(2-3) 终端手机号(4-9) 消息流水号(10-11) 消息包封装项(12-15)
byte[0-1] 消息ID word(16)
byte[2-3] 消息体属性 word(16)
bit[0-9] 消息体长度
bit[10-12] 数据加密方式
此三位都为 0,表示消息体不加密
第 10 位为 1,表示消息体经过 RSA 算法加密
其它保留
bit[13] 分包
1:消息体卫长消息,进行分包发送处理,具体分包信息由消息包封装项决定
0:则消息头中无消息包封装项字段
bit[14-15] 保留
byte[4-9] 终端手机号或设备ID bcd[6]
根据安装后终端自身的手机号转换
手机号不足12 位,则在前面补 0
byte[10-11] 消息流水号 word(16)
按发送顺序从 0 开始循环累加
byte[12-15] 消息包封装项
byte[0-1] 消息包总数(word(16))
该消息分包后得总包数
byte[2-3] 包序号(word(16))
从 1 开始
如果消息体属性中相关标识位确定消息分包处理,则该项有内容
否则无该项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
编码
7E 02 00 00 3F 00 00 04 02 18 95 00 0B 00 00 00 00 00 04 00 03 01 58 CC AA 06 CB 79 F5 00 95 00 00 00 00 16 01 05 16 54 15 01 04 00 00 69 74 02 02 00 00 03 02 00 00 25 04 00 00 00 00 2B 04 00 00 00 00 30 01 00 31 01 0B 32 01 46 7C 7E
解码
Mqtt
MQTT客户端
一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:
(1)发布其他客户端可能会订阅的信息;
(2)订阅其它客户端发布的消息;
(3)退订或删除应用程序的消息;
(4)断开与服务器连接。
MQTT服务器
开源:mosquito,emq
MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:
(1)接受来自客户的网络连接;
(2)接受客户发布的应用信息;
(3)处理来自客户端的订阅和退订请求;
(4)向订阅的客户转发应用程序消息。
数据包结构
在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成。
MQTT 数据包结构
固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容
1. MQTT固定头
固定头存在于所有MQTT数据包中,其结构如下:
1.1 MQTT数据包类型
位置:byte 1, bits 7-4。
相于一个4位的无符号值,类型如下:
1.2 标识位
位置:byte 1, bits 3-0。
在不使用标识位的消息类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接:
DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为 1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
QoS:发布消息的服务质量,即:保证消息传递的次数
00:最多一次,即:<=1
01:至少一次,即:>=1
10:一次,即:=1
11:预留
RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。
1.3 剩余长度(Remaining Length)
位置:byte 1。
固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。
2.MQTT可变头
MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:
很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
CONNECT报文的可变报头按下列次序包含四个字段:
协议名(Protocol Name)
协议级别(Protocol Level)
连接标志(Connect Flags)
保持连接(Keep Alive)。
3.Payload消息体
Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:
CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
UNSUBSCRIBE,消息体内容是要订阅的主题。
硬件
Jetson nano
Haas
Raspberry Pi
Ruff
HaaS600 EC600S 开发板
1.串口
Enhanced COM Port 为日志串口
Standard COM Port 为用户串口
$ ./amp.exe seriallist
COM5
COM4
1
2
3
...
1569/main | app_status_indication_set 1
1569/main | platform_init_step1 done, user_init=3, ret=0
1569/main | platform_init_step1 enter temprature cali on signal
1569/main | board_init platform_init_step1 done
1573/main_task | sys_init go
1573/main_task | sys freq calc : 320000000, wifi init 1
1573/main_task | sys_init soc_peripheral_init done
Welcome to AliOS Things
1574/main_task | sys_init aos_components_init done
1574/main_task | mesh has been opened
[Jan 01 00:00:01.482]<I>ULOG-test sys_init aos_components_init done
nano entry here!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2.putty
单片机或计算机在串口通信时的速率。
例如假设数据传送速率为120符号/秒(symbol/s)(也就是波特率为120Baud),又假设每一个符号为8位(bit),则其传送的比特率为(120symbol/s) * (8bit/symbol)=960bps.。
3.push
$ ./amp.exe serialput ./app COM5 -b 115200
device type: ymodem
generating app package...
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Why you should do it regularly:
https://github.com/browserslist/browserslist#browsers-data-updating
Wait shakehand with board ...
Please reboot board now
Putting: ██████████████████████████████ 2/2
put complete!
1
2
3
4
5
6
7
8
9
10
11
12
13
4.reboot
5.代码
import * as http from 'http'
var gpio = require('gpio');
var mqtt = require('mqtt');
var network = require('network');
var switch_01 = gpio.open({
id: 'D13'
});
var net = network.openNetWorkClient();
var netType = net.getType();
var netStatus = net.getStatus();
var switch_01_status = 0;
if (netStatus == 'connect') {
/* 网络状态已连接,获取网络状态 */
getNetInfo();
} else {
/* wifi或者以太网,设置ifconfig */
if (netType === "wifi" || netType === "ethnet") {
net.setIfConfig({
dhcp_en: true, // true: 动态IP模式(以下参数可忽略); false: 静态IP模式(以下参数必填)
ip_addr: '192.168.124.66',
mask: '255.255.255.0',
gw: '192.168.124.1',
dns_server: '8.8.8.8'
});
}
/* 网络状态未连接,如果是wifi设备则主动联网(4G模组中系统会自动注网) */
if (netType === "wifi") {
net.connect({
ssid: 'wangpengpeng-ssid', //热点ssid
password: '******' //热点的密码
});
}
/**
* 监听网络连接成功事件,成功执行回调函数
*/
net.on('connect', function() {
getNetInfo();
// create mqtt client
createMQTTClient();
});
net.on('disconnect', function() {});
}
function getNetInfo() {
console.log('net status is connected, begin getting net information...');
var info = net.getInfo();
if (netType === "wifi" || netType === "ethnet") {
/* 是否开启dhcp */
console.log('net dhcp_en is: ' + info.netInfo.dhcp_en);
/* ip地址*/
console.log('net ip_addr is: ' + info.netInfo.ip_addr);
/* dns */
console.log('net dns_server is: ' + info.netInfo.dns_server);
/* 网关 */
console.log('net gateway is: ' + info.netInfo.gw);
/* 子网掩码 */
console.log('net mask is: ' + info.netInfo.mask);
/* mac地址 */
console.log('net mac is: ' + info.netInfo.mac);
/* wifi信号强度 */
console.log('net wifi rssi is: ' + info.netInfo.rssi);
return;
}
console.log('unkown net type');
}
function createMQTTClient() {
var client = mqtt.createClient({
host: 'de28fe41.cn-hangzhou.emqx.cloud',
port: 15129,
clientId: 'wangpengpeng_01',
username: 'wangpengpeng',
password: '******',
});
client.on('connect', function() {
// subscribe
client.subscribe({
topic: '/open',
success: function() {
switch_01_status = 1
switch_01.writeValue(switch_01_status);
},
fail: function() {}
});
// subscribe
client.subscribe({
topic: '/close',
success: function() {
switch_01_status = 0
switch_01.writeValue(switch_01_status);
},
fail: function() {}
});
// publish
setInterval(function() {
client.publish({
topic: '/push',
message: switch_01_status
});
}, 3 * 1000);
});
client.on('disconnect', function() {
console.log('mqtt disconnect');
});
client.on('reconnect', function() {
console.log('mqtt reconnect');
});
client.on('message', function(topic, payload) {
console.log('[' + topic + '] message: ' + payload);
});
client.on('close', function() {
console.log('mqtt close');
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
王鹏鹏鹏
关注
0
0
0
JT808-2019协议技术规范.pdf
01-09
JT808-2019协议技术规范带
JT808-2019和JT809-2019协议PDF版
07-17
部标平台相关协议之809协议2019版本和部标平台相关协议之808协议2019版本,与2011版本有变化。 本标准代替JT/T809-2011 《道路运输车辆卫星定位系统平台数据交换
参与评论 您还未登录,请先 登录 后发表或查看评论
jt808协议详解_zybiao2的博客_jt808协议
3-27
jt808协议详解 7E0200005B014141138693224E00000100000000000157E6DE06CBEC600000000000001703090019200104000026F5EB3700060089FFFFFFFD000700B400FFFFFFFF002400A901CC000627BD0FABCC27910000B727911287BF27BD1159C327BD0000BB27910ED1B5C97E...
jt t808协议c语言,部标JT808协议解码包: 提供部标JT/T8...
3-8
4[01] 协议版本号: 1 5[00000000017299841738] 终端手机号: 17299841738 15[ffff] 流水号: 65535 0[00000400] 报警标志: 1024 4[00000800] 状态: 2048 8[06eeb6ad] 纬度: 116307629
JT808-2019协议测试工具
12-02
JTIT 808一2019协议测试工具,自己python写的,非过检终端。 1.连接到服务端 2.可以收发报文,且能定时发送位置汇报的0200报文,以及点击按钮发送终端主动发的报文,并记录日志。 3.拆解报文
jt/t 808协议
04-03
这是交通局最新的808通讯协议,你可以查询相关的数据通讯命令,然后进行开发。
java解析JT808协议_NiceSzy的博客_jtt808报文解析
2-23
本篇文章将介绍JT808协议的解析思路。 另请大神绕路,不喜勿喷! 先写个大致的思路,有疑问可以联系本人,联系方式: emial:hylexus@163.com 1 JT808协议扫盲 1.1 数据类型 1.2 消息结构
4G无线防拆报警GPS定位器JT808 部标通讯协议及数据格式...
3-5
本协议采用的通信方式应符合 JT/T 794 中的相关规定。通信协议采用 TCP,平台作为 服务器端,终端作为客户端。 1.2.数据类型 协议消息中使用的数据类型见表 1: 表1 数据类型 数据类型 描述及要求 ...
JT808部标协议
04-11
JT808部标协议,道路运输车辆卫星定位系统终端通讯协议及数据格式。
java解析JT808协议
热门推荐
hylexus的博客
3万+
JT808协议扫描 1 数据类型 2 消息结构 3 消息头 解析 1 消息体实体类 2 字节数组到消息体实体类的转换 21 消息转换器 22 用到的工具类 221 BCD操作工具类 222 位操作工具类 3 和netty结合 31 netty处理器链 32 netty针对于JT808的消息处理器 33 用到的其他类 注 本篇文章将介绍JT808协议的解析思路。 另请大神绕路,不喜勿喷! 先写个大
jt808协议_通信协议设计
weixin_39946534的博客
2496
在网络应用中会涉及到很多通讯协议的使用,比如车联网、V2X的通讯协议,APP与后台Server交互的协议。同时有些协议可能是没有标准的,需要我们自己设计一套通信协议,当然我们肯定在某些已有协议之上再进行自定义。比如我们要定义T-Box与车联网平台的通讯,那么肯定会使用TCP/UDP作为基础协议,再基于这一层的协议进行自定义。关于到底选择TCP还是UDP就不多讨论了,下面对协议的设计做一下...
JT808详细解释
fei0700的博客
804
7E0200005B014141138693224E00000100000000000157E6DE06CBEC600000000000001703090019200104000026F5EB3700060089FFFFFFFD000700B400FFFFFFFF002400A901CC000627BD0FABCC27910000B727911287BF27BD1159C327BD0000BB27910ED1B5C97E ———————————————— 详细解释 7E -
部标JT808协议处理方案
难得糊涂
6529
序言 本来说弄个系列博客,但是在实施的过程中,发现没有想象的复杂.搞清楚下面的,后面的都是体力劳动 现在开始弄交通部808协议解析具体的实施,之前都是在研究框架.今天正式开始实施.本篇主要介绍一些基础知识.另没有源码,cuiyaonan2000@163.com 仅限问题讨论与实施方案的交流.本文使用的参考资料室JTT808-2013协议 位运算(一定要搞明白...
jt808 jt-808 JT/T808-2001 jt/t808-2001 部标协议 协议解析
hncdyj的专栏
9724
JT/T808-2011协议解析规则白话文详解(JAVA版本) 1.包详解 解析之前复习下java的数据结构,以及对应JT/L808-2011里面的数据类型。 JT/T808 JAVA数据类型 JT/L808描述 JAVA描述 BYTE Byte 无符号单字节整型(字节, 8 位) 以二进制补码表示的整数 WORD Short 无符号双字节整型(字节,16位) short数据类...
部标JT808 JT/T808协议网关
最新发布
WordPress
257
项目介绍 基于Netty,实现JT808 JT/T808部标协议的消息处理,与编码解码; 使用SpringBoot + MyBatis提供数据入库、Web接口服务; 协议部分不依赖Spring,可移除Spring独立运行(支持Android客户端); 最简洁、清爽、易用的部标开发框架。 主要特性 代码足够精简,便于二次开发; 致敬Spring、Hibernate设计理念,熟悉Web开发的同学上手极快; 使用注解描述协议,告别繁琐的封包、解包; 支持异步批量处理,显著提升MySQL入库性能;
北斗系统学习:JTT808协议初步解析
李迟的专栏
6118
本文学习部标(交通运输部)JT/T 808,并使用 Golang 语言解析。当然,仅使用位置数据进行演示,所以只是一个开端(是否有后续,暂未知)。本文不是科普,因此不会详细列出协议字段说明,可参考文后给出的资料。
交通部808协议介绍_基于交通部JT/T808协议的车联网物联网框架开发技术方案(源码)...
weixin_30291543的博客
496
(一)平台介绍1、接入网关应用采用mina/netty+spring架构,独立于其他应用,主要负责维护接入终端的tcp链接、上行以及下行消息的解码、编码、流量控制,黑白名单等安全控制,网关同时支持交通部JT/T808-2011、JT/T808-2013两个版本全部的808协议,网关应用提供二次开发接口,支持协议扩展而不需要改动任何原有代码。接入网关采用json消息通过MQ消息队列与业务平台进行交互...
JT/T808协议文档
12-05
JT/T808协议文档,这里介绍了JT/T808协议基本构成,报文类型,以及协议开发流程
国内物联网平台(8):中移物联网开放平台OneNet
weixin_30782331的博客
744
国内物联网平台(8)——中移物联网开放平台OneNet 马智 平台定位 OneNET是中移物联网有限公司搭建的开放、共赢设备云平台,为各种跨平台物联网应用、行业解决方案,提供简便的云端接入、存储、计算和展现,快速打造物联网产品应用,降低开发成本。 IoT PaaS基础能力:提供智能设备自助开发工具、后台技术支持服务、物联网专网、短彩信、位置定位、设...
基于JT/T808协议的车联网平台架构方案
gaoshbo的专栏
2万+
平台基于(《JT/T808-2011道路运输车辆卫星定位系统终端通讯协议及数据格式》、《JT/T808-2013道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范》、JT/T-796-2011《道路运输车辆卫星定位系统平台技术要求》、JT/T-1078-2016《道路运输车辆卫星定位系统车载视频通信协议》、JT/T-1077-2016《道路运输车辆卫星定位系统车载视频平台技术要求》...
基于JT808协议的.gps文件解析工具
05-15
基于JT808协议的.gps文件解析工具,简单易用,解析格式如下 时间 报警标志 状态 经度 纬度 高度 速度KM/H 方向 里程KM 附加信息或者统计数据(16进制显
————————————————
版权声明:本文为CSDN博主「王鹏鹏鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AAA17864308253/article/details/112951326