基于KT6368A的ibeacon版本蓝牙电子标签说明书_V2
目录
1.0 蓝牙ibeacon的简介
1.1 硬件最小系统
1.2 软件给出的ibeacon设置指令[S1][S2][S3][S4]
1.3 设置指令生效举例说明
1.4 软件给出的ibeacon查询指令[N1][N2][N3][N4]
1.5 设置蓝牙名和MAC地址以及查询
1.6 调试注意事项
1.0 蓝牙ibeacon的简介
Ibeacon,是苹果最新定义出来的。消息推送、室内定位 信标用途。目前接触到的客户的需求,是做一个ibeacon设备,然后客户的app收到之后,自动弹出他要做的事情,相当于一个信标一样 。0x004C是苹果的公司ID ,0x0059是nordic的ID。至于ibeacon的详细说明,可以网上再查查,做的复杂的其实也挺复杂的
1.1 硬件最小系统
目前标准的固件,给出的就是一个纯粹的ibeacon,可以AT指令设置 ibeacon的Major、Minor、uuid、厂商代码
以及蓝牙广播名称、蓝牙的mac地址
硬件上面也是非常的简单,参考KT6368A给出的标准原理图即可。
1.2 软件给出的ibeacon设置指令[S1][S2][S3][S4]
AT+S1ABCD\r\n | 设置IBEACON的Major 2个字节 设置major为0xABCD |
AT+S25678\r\n | 设置IBEACON的Minor 2个字节 设置minor为0x5678 |
AT+S3000C\r\n | 设置IBEACON的厂商代码 |
AT+S41234567812345678ABCDEF12345678FF\r\n | 设置uuid ,注意这里的uuid只能是128位,也就是16个字节 0x12 ,0x34 ,0x56 ,0x78 , 0x12 ,0x34 ,0x56 ,0x78 , 0xAB ,0xCD ,0xEF ,0x12 , 0x34 ,0x56 ,0x78 ,0xFF , 如果不满足16个字节,芯片会直接返回错误 |
1、这里关于ibeacon的参数设置,给出的4条指令,分别是AT+S1 、AT+S2、AT+S3、AT+S4 |
|
1.3 设置指令生效举例说明
其中的Major = 52651 = 0xCDAB
其中的Minor = 30806 = 0x7856
其中的厂商代码 = 0x000C
其中uuid部分,和上面串口发送AT指令则一致
1.4 软件给出的ibeacon查询指令[N1][N2][N3][N4]
AT+N1\r\n | 查询IBEACON的Major 2个字节 ,芯片返回:N1+ABCD/r/n |
AT+N2\r\n | 查询IBEACON的Minor 2个字节 ,芯片返回:N2+5678/r/n |
AT+N3\r\n | 查询IBEACON的厂商代码 ,芯片返回:N3+000C/r/n |
AT+N4\r\n | 查询uuid ,芯片返回N4+1234567812345678ABCDEF12345678FF/r/n 0x12 ,0x34 ,0x56 ,0x78 , 0x12 ,0x34 ,0x56 ,0x78 , 0xAB ,0xCD ,0xEF ,0x12 , 0x34 ,0x56 ,0x78 ,0xFF , |
查询的方法,如上图所示 |
1.5 设置蓝牙名和MAC地址以及查询
AT+BMBLE-1234\r\n | 设置蓝牙名称为“BLE-1234” |
AT+BN112233445566\r\n | 设置BLE的地址。手机端显示的地址是:66 55 44 33 22 11 |
1、设置蓝牙名称之后,需要让芯片复位,发指令或者断电上电都可以,这样会显示新的蓝牙名称。我们默认的蓝牙名为“KT6368A-IBEACON_V2.1”。设置的蓝牙名最长为“30”个字节,请不要超过这个范围 |
2、如果AT指令修改蓝牙名称之后,注意,你的手机端可能没有同步更新,还是显示之前的名称
(3)、只要设置了蓝牙名,蓝牙名一定是更新过来了的,不用怀疑。芯片上电也会返回蓝牙名给您查看 |
查询蓝牙名和MAC地址的指令如下:
AT+TM\r\n | 返回TM+1234\r\n 代表蓝牙名为1234 |
AT+TN\r\n | 返回TN+12345678AABB\r\n BLE的蓝牙地址:0xBB、0xAA、0x78、0x56、0x34、0x12 |
1.6 调试注意事项
AT+VER2.1-20220920 --- 芯片固件版本信息
TM+KT6368A-IBEACON_V2.1 --- 默认芯片出厂名称
TN+156038CF8DA6 --- 默认芯片的MAC地址
N1+ABCD
N2+5678
N3+000C
N4+1234567812345678ABCDEF12345678FF
芯片上电是一定会返回这些信息的,通过串口,波特率115200
这样做的目的,是方便您在使用的过程中,能增加一个排错的方法而已,并无其他绝对的作用
// Array of URL Scheme Prefices
static char *eddystoneURLPrefix[EDDYSTONE_URL_PREFIX_MAX] = {
"http://www.",
"https://www.",
"http://",
"https://"
};
// Array of URLs to be encoded
static char *eddystoneURLEncoding[EDDYSTONE_URL_ENCODING_MAX] = {
".com/",
".org/",
".edu/",
".net/",
".info/",
".biz/",
".gov/",
".com/",
".org/",
".edu/",
".net/",
".info/",
".biz/",
".gov/"
};
/**
将普通网址, 转成特制的url
参数:
urlOrg: 原始网址,纯字符串格式
urlEnc: 输出的特制url网址,
返回值: 返回urlEnc的实际长度, 错误返回0,
注意事项: 输入的网址长度不能太长.
**/
static uint8 SimpleEddystoneBeacon_encodeURL(char *urlOrg, uint8 *urlEnc)
{
uint8 i, j;
uint8 urlLen;
uint8 tokenLen;
urlLen = (uint8) strlen(urlOrg);
// search for a matching prefix
for (i = 0; i < EDDYSTONE_URL_PREFIX_MAX; i++) {
tokenLen = strlen(eddystoneURLPrefix[i]);
if (strncmp(eddystoneURLPrefix[i], urlOrg, tokenLen) == 0) {
break;
}
}
if (i == EDDYSTONE_URL_PREFIX_MAX) {
return 0; // wrong prefix
}
// use the matching prefix number
urlEnc[0] = i;
urlOrg += tokenLen;
urlLen -= tokenLen;
// search for a token to be encoded
for (i = 0; i < urlLen; i++) {
for (j = 0; j < EDDYSTONE_URL_ENCODING_MAX; j++) {
tokenLen = strlen(eddystoneURLEncoding[j]);
if (strncmp(eddystoneURLEncoding[j], urlOrg + i, tokenLen) == 0) {
// matching part found
break;
}
}
if (j < EDDYSTONE_URL_ENCODING_MAX) {
memcpy(&urlEnc[1], urlOrg, i);
// use the encoded byte
urlEnc[i + 1] = j;
break;
}
}
if (i < urlLen) {
memcpy(&urlEnc[i + 2], urlOrg + i + tokenLen, urlLen - i - tokenLen);
return urlLen - tokenLen + 2;
}
memcpy(&urlEnc[1], urlOrg, urlLen);
return urlLen + 1;
}
static int make_set_adv_data(void)
{
u8 offset = 0;
u8 *buf = adv_data;
/* offset += make_eir_packet_val(&buf[offset], offset, HCI_EIR_DATATYPE_FLAGS, 0x06, 1); */
offset += make_beacon_packet(&buf[offset], &eddystone_etlm_adv_packet, EDDYSTONE_ETLM_PACKET, NULL);
/* offset += make_beacon_packet(&buf[offset], &eddystone_eid_adv_packet, EDDYSTONE_EID_PACKET, NULL); */
// offset += make_beacon_packet(&buf[offset], &eddystone_url_adv_packet, EDDYSTONE_URL_PACKET, "https://fanyi.baidu.com/");
// offset += make_beacon_packet(&buf[offset], &eddystone_tlm_adv_packet, EDDYSTONE_TLM_PACKET, NULL);
// offset += make_beacon_packet(&buf[offset], &eddystone_uid_adv_packet, EDDYSTONE_UID_PACKET, NULL);
// offset += make_beacon_packet(&buf[offset], &ibeacon_adv_packet, IBEACON_PACKET, NULL);
if (offset > ADV_RSP_PACKET_MAX) {
puts("***adv_data overflow!!!!!!\n");
return -1;
}
log_info("adv_data(%d):", offset);
log_info_hexdump(buf, offset);
adv_data_len = offset;
ble_op_set_adv_data(offset, buf);
return 0;
}
static int make_set_rsp_data(void)
{
u8 offset = 0;
u8 *buf = scan_rsp_data;
u8 name_len = gap_device_name_len;
u8 vaild_len = ADV_RSP_PACKET_MAX - (offset + 2);
if (name_len > vaild_len) {
name_len = vaild_len;
}
offset += make_eir_packet_data(&buf[offset], offset, HCI_EIR_DATATYPE_COMPLETE_LOCAL_NAME, (void *)gap_device_name, name_len);
if (offset > ADV_RSP_PACKET_MAX) {
puts("***rsp_data overflow!!!!!!\n");
return -1;
}
log_info("rsp_data(%d):", offset);
log_info_hexdump(buf, offset);
scan_rsp_data_len = offset;
ble_op_set_rsp_data(offset, buf);
return 0;
}
#define DISPLAY_NAME_DEBUG 0 //rsp 显示 name
//广播参数设置
static void advertisements_setup_init()
{
#if DISPLAY_NAME_DEBUG
uint8_t adv_type = ADV_NONCONN_IND; //no rsp_data
#else
uint8_t adv_type = ADV_SCAN_IND;
#endif
uint8_t adv_channel = ADV_CHANNEL_ALL;
int ret = 0;
ble_op_set_adv_param(ADV_INTERVAL_MIN, adv_type, adv_channel);
ret |= make_set_adv_data();
#if DISPLAY_NAME_DEBUG
ret |= make_set_rsp_data();
#endif
if (ret) {
puts("advertisements_setup_init fail !!!!!!\n");
return;
}
}