总览
inSona照明控制系统由硬件、云端、⽤⼾App组成。 硬件包括⽹关、灯具、传感器、⾯板等。
⽹关通过蓝⽛MESH协议与其他设备进⾏通信,通过Wi-Fi或者有线与云端/本地服务器通信。App通过局域⽹或者服务器与⽹关通信,并实现设备的控制。
⽹关:⼀个特殊硬件设备,所有系统的其他类型设备统称为⼦设备,⽽与之相对的就是⽹关, 称为桥设备。⼦设备本⾝只有蓝⽛通信能⼒,⽽桥设备同时具备蓝⽛和WiFi和以太⽹能⼒。桥设备是连接互联⽹和蓝⽛MESH⽹络的桥梁,在中间承担协议翻译,信息存储和转发的功能。
inSona提供本地控制协议,第三⽅设备可以通过局域⽹发现协议扫描发现附近的⽹关,然后设备可以⽹关建⽴TCP连接,后续所有操作都建⽴在TCP通讯的基础上。整个流程如下: 本地发现⽹关-->建⽴socket连接-->同步设备信息-->设备控制/状态同步等。
inSona API
inSona API 用于从本地网关通过TCP连接获取到蓝牙mesh网络内的设备信息
版本历史
- V1-用户通过TCP会话并请求与网络相关的信息
- V2-2020.1210 添加传感器支持
- V3-2021.423 增加场景数据和控制支持
- V4-2021.526 增加面板按键数量标识,开关灯亮度色温反馈,
开始吧
- 获取网关IP地址,通过inSona APP操作添加网关设备
- 进入网关页面,查看网关设备IP
- 通过控制TCP连接与网关建立会话
建立TCP连接
通过TCP建立网络连接,网关端口号为:8091
以Python为例
from socket import *
HOST = '127.0.0.1' # or 'localhost'
PORT = 8091
BUFSIZ =1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
控制协议
消息内容
客⼾端和⽹关之间使⽤JSON格式的消息进⾏交互,消息基于TCP协议进⾏传递;消息之间 以“\r\n”作分隔
请求消息的基本格式如下:
{
"version": 1,
"uuid": 1234,
"type": "all",
"method": "c.query"
}
字段定义
version:
协议版本,⽬前只有⼀个可⽤版本1。
uuid:
请求uuid,请求消息与回应消息的uuid相同,可根据这个来匹配
method:
方法名
⽬前以⽀持的上下⾏消息的⽅法有如下⼏种:
方向 | Method | 说明 |
---|---|---|
客户端->网关 | c.query | 请求mesh内设备信息 |
网关->客户端 | s.query | 返回mesh内设备信息 |
客户端->网关 | c.control | 控制设备 |
网关->客户端 | s.control | 返回控制设备是否成功 |
网关->客户端 | s.event | 网关主动通知 |
同步设备
客户端发起同步请求
{
"version": 1,
"uuid": 1234,
"type":"all",
"method": "c.query"
}
服务端返回设备信息
代码示例:
{
"version": 1,
"uuid": 1234,
"method": "s.query",
"result": "ok",
"rooms": [{
"roomId": 6,
"name": "办公区"
}, {
"roomId": 14,
"name": "会议室"
}, {
"roomId": 5,
"name": "仓库"
}],
"devices": [{
"did": "ECC57F10015800",
"pid": 3,
"ver": "61719",
"type": 1984,
"alive": 1,
"roomId": 2,
"name": "左",
"func": 0,
"funcs": [],
"value": []
}, {
"did": "ECC57F1003E000",
"pid": 3,
"ver": "61719",
"type": 1984,
"alive": 1,
"roomId": 2,
"name": "右",
"func": 0,
"funcs": [],
"value": []
}, {
"did": "ECC57F1031F100",
"pid": 256,
"ver": "61706",
"type": 1984,
"alive": 1,
"roomId": 26,
"name": "会议过道",
"func": 4,
"funcs": [2, 3, 4, 11],
"value": [0, 100, 8]
}, {
"did": "ECC57F10327200",
"pid": 256,
"ver": "61706",
"type": 1984,
"alive": 1,
"roomId": 26,
"name": "茶柜灯",
"func": 4,
"funcs": [2, 3, 4, 11],
"value": [0, 100, 8]
}, {
"did": "ECC57F1038DD00",
"pid": 256,
"ver": "61706",
"type": 1984,
"alive": 1,
"roomId": 26,
"name": "沙发射灯",
"func": 4,
"funcs": [2, 3, 4, 11],
"value": [0, 54, 8]
}]
}
表示有2个设备 其中单设备为 "F0ACD777770300" 支持亮度色温,当前为on,50%,50%,
组地址“A0” 支持亮度色温,当前为on,50%,50%
“F0ACD760002D00” 为传感器
"rooms"为当前蓝牙网络内的房间信息,roomId与设备内的roomId对应
{
"did": "ECC57F11A6B0FF",
"pid": 27,
"ver": "61736",
"type": 1218,
"alive": 1,
"roomId": 1,
"name": "大厅右面板",
"func": 9,
"funcs": [9],
"value": [4]
}
面板数据,通过value[4]代表此面板按键数量为4键面板
关于灯具类型区分,inSona设备分为 继电器开关,单色温调光,双色温,RGB,RGB+双色温
根据同步返回的数据,对设备的funcs进行解析
【2,11】继电器的灯 【2,3,11】 只调光的灯 【2,3,4,11】双色温灯 【2,3,5,11】RGB灯 【2,3,4,5,11】 RGB+双色温
字段 | 可选值 | 含义 |
---|---|---|
did | 设备唯一标识 | |
pid | 表示设备生产厂家,产品型号 | |
ver | 软件版本 | |
type | 灯具(1984) 窗帘(1860) 面板(1218) 传感器(1344) |
设备类型 |
alive | 设备在线状态 (1.在线,0.不在线) | |
name | 设备名称(APP内修改) | |
func |
开关(2) 亮度(3) 亮度色温(4) HSL(RGB)(5) 传感器(10) |
当前的功能 |
value |
开关([0/1]) 亮度([0-100]) 亮度色温([0-100,0-100]) HSL([0-100,0-360,0-100]) 传感器(NULL) |
当前的设备状态 |
roomId | "roomId": 26, | 表示设备对应的房间id,可以根据房间列表信息做对应 |
控制设备
客户端发起控制设备请求
示例代码:
{
"version": 1,
"uuid": 1,
"method": "c.control",
"did": "F0ACD777770300",
"action": "onoff",
"value": [0],
"transition": 0
}
表示把设备"F0ACD777770300"设为关闭
{
"version": 1,
"uuid": 1,
"method": "c.control",
"did": "a0",
"action": "level",
"value": [30],
"transition": 0
}
表示把组设备"a0"设为亮度30%
{
"version": 1,
"uuid": 1,
"method": "c.control",
"did": "ECC57F10B3C500",
"action": "curtainstop",
"value": [],
"transition": 0
}
"action": "curtainstop",为窗帘停止命令 value为空
字段 | 可选值 | 含义 |
---|---|---|
did | 设备唯一标识 | |
action | 开关(“onoff”) 亮度(“level”) 亮度色温(“ctl”) HSL(RGB)( “hsl”) "curtainstop"窗帘停止 "curtainangel"梦幻帘角度控制 |
控制类型,根据返回的设备发送对应的控制类型 |
value |
开关([0/1]) 亮度([0-100]) 亮度色温([0-100,0-100]) HSL([0-100,0-360,0-100]) 角度([0-180]) |
控制参数 对RGB设备,发HSL指令,第一个参数为亮度值0-100,第二个参数对应颜色,0-360,如红色为0 绿色120,蓝色240 第三个参数为饱和度可以默认发100最鲜艳 |
transition | 0-4294967295 | 单位毫秒(ms) |
服务端返回控制设备是否成功
如果控制成功服务端将返回“OK”
表示控制成功的返回
{
"version": 1,
"uuid": 1,
"method": "s.control",
"result": "ok"
}
服务器主动上报event
当网内设备发生状态改变,服务器会主动反馈当前改变状态设备的数据
设备状态改变
示例代码:
{
"version": 1,
"uuid": 14,
"method": "s.event",
"evt": "status",
"did": "F0ACD777770300",
"func": 2,
"value": [0]
}
表示设备"F0ACD777770300"被关了
{
"version": 1,
"uuid": 16,
"method": "s.event",
"evt": "status",
"did": "F0ACD777770300",
"func": 4,
"value": [15, 50]
}
表示设备"F0ACD777770300"亮度色温被调到15%,50%
通过开关模式打开设备,当设备打开是反馈数据如下
{
"version": 1,
"uuid": 617,
"method": "s.event",
"evt": "status",
"did": "A9",
"func": 2,
"value": [1],
"status": [4, 85, 0]
}
value [1] 表示设备被打开,status[4,85,0] 4表示双色温CTL命令,85表示当前亮度,0表示色温值
字段 | 可选值 | 含义 |
---|---|---|
did | 设备唯一标识 | |
evt | “status”,"sensor" | 设备状态改变 |
func |
开关(2) 亮度(3) 亮度色温(4) HSL(RGB)(5) |
当前的功能 |
value |
开关([0/1]) 亮度([0-100]) 亮度色温([0-100,0-100]) HSL([0-100,0-360,0-100]) |
控制参数 |
传感器状态上报事件
{
"version": 1,
"uuid": 4,
"method": "s.event",
"evt": "sensor",
"did": "F0ACD760002D00",
"func": 10,
"value": [1, 1]
}
表示传感器" F0ACD760002D00"人感被触发值为1
字段 | 可选值 | 含义 |
---|---|---|
property | 1,2 | 人感(1),光感(2) |
触发状态 | 传感器数据(1 表示被触发) |
面板按键状态上报事件
{
"version": 1,
"uuid": 1632,
"method": "s.event",
"evt": "switch.key",
"did": "ECC57F108F3BFF",
"func": 9,
"value": [3, 0]
}
表示面板" ECC57F108F3BFF"第3个按键被按下 【3,0】代表按键3被按下
字段 | 参数 | 含义 |
---|---|---|
触发状态(value 数组形式) | 3,0 | 按键(3),(0)按下(1)松开(2)长按 |
同步场景数据
客户端发起同步请求
{
"version": 1,
"uuid": 1234,
"method": "c.query.scene"
}
服务端返回设备信息
代码示例:
{
"version": 1,
"uuid": 0,
"method": "s.query.scene",
"scenes": [{
"sceneId": 2,
"name": "喝茶"
},
{
"sceneId": 4,
"name": "会议"
}, {
"sceneId": 3,
"name": "会议室"
}, {
"sceneId": 8,
"name": "上班模式"
}, {
"sceneId": 12,
"name": "感应关"
}, {
"sceneId": 14,
"name": "直播"
}, {
"sceneId": 15,
"name": "会客模式"
}, {
"sceneId": 16,
"name": "色温展示"
}, {
"sceneId": 17,
"name": "桌上黄"
}, {
"sceneId": 18,
"name": "桌上白"
}, {
"sceneId": 19,
"name": "暖色暗"
}, {
"sceneId": 20,
"name": "背景亮"
},
{
"sceneId": 21,
"name": "背景暗"
}, {
"sceneId": 22,
"name": "全白"
}
]
}
}
场景控制
客户端发起控制场景请求
{
"version": 1,
"uuid": 1,
"method": "c.control",
"action": "scene",
"value": ["33"], 此value为上面同步获取的场景ID
"transition": 0
}