IP网关协议
<p>[TOC]</p>
<h1>IP网关协议</h1>
<h1>注意: 所有向设备发送的数据,必须以 16进制的"0b0a"结束</h1>
<p>协议组成</p>
<ul>
<li>header</li>
<li>payload</li>
</ul>
<pre><code>==== mqtt 数据长度限制=====
typedef struct {
char timeStamp[15];
} mqtt_head_data_t;
typedef struct {
char nodeid[3];
char action[15];
char params[20];
} mqtt_device_data_t;</code></pre>
<h2>消息组成</h2>
<h3>header 消息</h3>
<p><strong>Header消息包含</strong></p>
<ul>
<li>timeStamp --- 消息生成的时间戳</li>
</ul>
<p>消息格式</p>
<pre><code class="language-json">{
"header":{
"timeStamp":"1592983921388"
}
}</code></pre>
<h3>payload 消息</h3>
<p><strong>payload消息包含</strong></p>
<ul>
<li>nodeid --- 网关的为000 设备的为1~127</li>
<li>action --- 操作类型</li>
<li>params --- 操作内容,由subID与mode_id 以及数据组成</li>
<li>serviceid --- 业务id,APP端消息页面渲染模板</li>
</ul>
<p><strong>示例:</strong></p>
<pre><code class="language-json">{
"payload":{
"devices":[
{
"nodeid":"001",
"action":"command",
"serviceid":"10110e01",
"params":"0110021100000000"
}
]
}
}</code></pre>
<h2>设备激活</h2>
<p><strong>示例</strong>
<strong>向设备发送的数据</strong>
<strong> topic /xm/sh/request/mqtt/1320420010132811/active </strong></p>
<pre><code class="language-json">{
"device_id":"1320420010132811", //设备sn
"mqtt_host":"mqtt.xunmingiot.com", //mqtt服务器域名或ip地址
"mqtt_port":8883, //mqtt端口,注意是SSL端口
"mqtt_user":"1320420010132811", //mqtt登录用户名
"mqtt_pass":"54491741804120xxxxxx", //mqtt登录密码
"security":1,
"mqtt_keepalive":120,
"slot":16 //槽位指示即0x10
}</code></pre>
<h2>主动同步</h2>
<p><strong>此指令是发给网关的,发出后网关会将此网关下的所有设备主动上报一遍消息</strong></p>
<p><strong>示例:</strong>
<strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":"1592983921388"
},
"payload":{
"devices":[
{
"nodeid":"000",
"action":"sync",
"params":""
}
]
}
}</code></pre>
<p><strong>设备响应数据</strong> </p>
<pre><code class="language-json">{
"header":{
"timeStamp":"1592983921388"
},
"payload":{
"devices":[
{
"nodeid": "000",
"action":"sync",
"serviceid":"10110e01"
"params":"012001005e000000"
}
]
}
}</code></pre>
<h2>控制设备</h2>
<p><strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
'header': {'timeStamp': ''},
'payload': {
'devices': [
{
'nodeid': '001', // 所要控制设备的nodeid
'action': 'command',
'params': '0110111100000000' // 控制的数据
}
]
}
}</code></pre>
<p><strong>设备响应数据</strong> </p>
<pre><code class="language-json">{
"header":{
"timeStamp":"1592983921388"
},
"payload":{
"devices":[
{
"nodeid": "001",
"action":"command",
"params":"0110111100000000"
}
]
}
}</code></pre>
<h2>重启设备</h2>
<p><strong>topic /xm/sh/request/mqtt/13204200010XXXXXX/2001/v1</strong>
<strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
'header': {'timeStamp': ''},
'payload': {
'devices': [
{
'nodeid': '000',
'action': 'restart',
'params': ""
}
]
}
}</code></pre>
<h2>ota升级</h2>
<p><strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
'header': {'timeStamp': ''},
'payload': {
'devices': [
{
'nodeid': '000', // 所要控制设备的nodeid
'action': 'ota',
'params': {
"modeid":"2001",
"ser_ip":"127.223.4.1", //文件下载服务器地址
"new_ver":"a1.0.9.t20010j01" // 所要ota升级的版本号
}
}
]
}
}</code></pre>
<p><strong>设备响应数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":"1592983921388"
},
"payload":{
"devices":[
{
"nodeid": "000",
"action":"ota",
"params":"0,a1.0.9.t20010j01" // 逗号前面是升级状态 0是成功 1是失败,逗号后面是版本号
}
]
}
}</code></pre>
<h2>wifi设备 如何设置wifi</h2>
<p><strong>topic: /xm/sh/request/mqtt/13204200010XXXXXX/2001/v1 </strong></p>
<h3>一、发现周围wifi网络</h3>
<p><strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":""
},"payload":
{"devices":
[{
"nodeid":"000",
"action":"scan_wifi",
"params":""
}]
}
}</code></pre>
<p><strong>设备响应数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":""
},
"payload":{
"devices":[{
"nodeid":"000",
"action":"scan_wifi",
"params":"SaiTong,bc:54:fc:94:43:f0,WPA+2,60,1;shenxuehulian,8c:53:c3:9f:77:fc,WPA+2,60,1;"
}] // params 为周围wifi信息,顺序为: wifi名 mac地址 网络类型 信号 1
}
}
注意: wifi名称为中文的无法发现</code></pre>
<h3>二、手动配置WIFI</h3>
<p><strong>topic: /xm/sh/request/mqtt/13204200010XXXXXX/2001/v1 </strong>
<strong>向设备发送的数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":""
},
"payload":{
"devices":[{
"nodeid":"000",
"action":"set_wifi",
"params":{
"ssid":"123", // ssid 为wifi名称
"passwd":"123465" // passwd 为密码
}
}]
}
}</code></pre>
<p><strong>设备响应数据</strong></p>
<pre><code class="language-json">{
"header":{
"timeStamp":""
},
"payload":{
"devices":[{
"nodeid":"000",
"action":"set_wifi",
"params":"0" //params 为0时,代表设置成功
}]
}
}</code></pre>
<h2>数据解析</h2>
<h3>MQTT-Topic 规则</h3>
<p><strong>设备类型与控制时mode_id的对应关系</strong></p>
<table>
<thead>
<tr>
<th>类别</th>
<th>对应mode_id</th>
</tr>
</thead>
<tbody>
<tr>
<td>wifi网关</td>
<td>2001</td>
</tr>
<tr>
<td>4G网关</td>
<td>2002</td>
</tr>
<tr>
<td>电子锁</td>
<td>1011</td>
</tr>
<tr>
<td>GPS模块</td>
<td>1010</td>
</tr>
<tr>
<td>温度模块</td>
<td>1012</td>
</tr>
<tr>
<td>AGPS模块</td>
<td>1013</td>
</tr>
</tbody>
</table>
<pre><code> request时的topic:
/xm/sh/request/mqtt/1320420010122011/2001/v1
/xm/sh/request/mqtt/网关的sn号/所要控制设备的mode_id/v1
response时的topic:
/xm/sh/response/mqtt/1320420010122011/1011/v1
/xm/sh/response/mqtt/网关的sn号/设备的mode_id/v1</code></pre>
<h3>action 对应关系</h3>
<table>
<thead>
<tr>
<th>action</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>command</td>
<td>正常上报/主动控制设备</td>
</tr>
<tr>
<td>sync</td>
<td>网关主动同步所有设备数据</td>
</tr>
<tr>
<td>ota</td>
<td>给设备OTA升级</td>
</tr>
<tr>
<td>set_wifi</td>
<td>设置wifi网络</td>
</tr>
<tr>
<td>scan_wifi</td>
<td>发现周围wifi网络,注意发现不了名称为中文的网络</td>
</tr>
<tr>
<td>restart</td>
<td>重启设备</td>
</tr>
</tbody>
</table>
<h3>params 解析规则</h3>
<p><strong>网关数据示例: 01 2001 00 5e 000000 </strong></p>
<table>
<thead>
<tr>
<th>数值</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>设备节点id</td>
</tr>
<tr>
<td>2001</td>
<td>网关的 mode_id</td>
</tr>
<tr>
<td>00</td>
<td>16进制,网关的电量百分比</td>
</tr>
<tr>
<td>5e</td>
<td>16进制,网关的信号百分比</td>
</tr>
<tr>
<td>000000</td>
<td>未使用,占位</td>
</tr>
</tbody>
</table>
<p><strong>电子锁的数据示例: 01 1011 1 1 0012 01 00 </strong></p>
<table>
<thead>
<tr>
<th>数值</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>设备节点id</td>
</tr>
<tr>
<td>1011</td>
<td>锁的 mode_id</td>
</tr>
<tr>
<td>1</td>
<td>16进制,需转成2进制,从左往右依次为 1号位 2号位 3号位 4号位,哪一位上是1代表启用了哪一位,如: '0101' 代表1号位跟3号位启用</td>
</tr>
<tr>
<td>1</td>
<td>16进制,需转成2进制,从左往右依次为 1号位 2号位 3号位 4号位,与上面对应,0位关闭状态,1为开启,如: '0101' 代表1号位跟3号位开启,其余位置关闭</td>
</tr>
<tr>
<td>0012</td>
<td>开锁保持时间</td>
</tr>
<tr>
<td>01</td>
<td>是否自动关锁,0:不关,1:保持时间结束后关锁</td>
</tr>
<tr>
<td>00</td>
<td>未使用,占位</td>
</tr>
</tbody>
</table>
<h3>示例: 开锁</h3>
<p><strong>向设备发送的数据</strong></p>
<p><strong>topic: /xm/sh/request/mqtt/13204200010XXXXXX/1011/v1 </strong></p>
<pre><code class="language-json">{"header":{"timeStamp":""},"payload":{"devices":[{"nodeid":"000","action":"command","params":"0110111100000000"}]}}</code></pre>
<p><strong>设备响应数据</strong>
<strong>topic: /xm/sh/response/mqtt/13204200010XXXXXX/1011/v1</strong></p>
<pre><code class="language-json">{"header":{"timeStamp":""},"payload":{"devices":[{"nodeid":"000","action":"command","params":"0110111100000000"}]}}</code></pre>