当前位置: 首页 > biancheng >正文

基于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. 发送AT指令之后,芯片会返回OK,代表AT指令设置成功
  2. 等到参数全部设置完毕之后,一定要断电,再上电,才生效

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指令修改蓝牙名称之后,注意,你的手机端可能没有同步更新,还是显示之前的名称

  1. 、因为你只修改了蓝牙的名称,蓝牙的MAC地址是没有变化的,所以手机端那边是不会更新名字
  2. 、你要做的就是,换一台手机搜索试试,或者之前的手机删掉配对信息,重新在搜索

(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;
    }
}

相关文章:

  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)
  • 持续精进,改变自己