Initial code.
This commit is contained in:
parent
1206b2e43f
commit
9008e00cc6
Binary file not shown.
|
@ -0,0 +1,30 @@
|
||||||
|
#include "DLLN3X.h"
|
||||||
|
|
||||||
|
DLLN3X dlln33; //Instantiating DLLN3X module
|
||||||
|
|
||||||
|
void zigbee_call_back(unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length) {
|
||||||
|
switch (orig_port) {
|
||||||
|
case 0x82:
|
||||||
|
{
|
||||||
|
/* Do everything you want to do */
|
||||||
|
Serial.println("Hello from port 0x82!");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
dlln33.init(&Serial1);
|
||||||
|
dlln33.setcallback(zigbee_call_back);
|
||||||
|
Serial.printf("DLLN33 addr is 0x%X\n", dlln33.read_addr());
|
||||||
|
dlln33.send(0x81, 0x82, dlln33.read_addr(), (uint8_t *)"Hello to port 0x81!", 21);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
dlln33.loop();
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
#######################################
|
||||||
|
# Syntax Coloring Map For DLLN3X
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
DLLN3X KEYWORD1
|
||||||
|
zigbee_frame KEYWORD1
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
_clear KEYWORD2
|
||||||
|
_pack KEYWORD2
|
||||||
|
_depack KEYWORD2
|
||||||
|
_callback KEYWORD2
|
||||||
|
init KEYWORD2
|
||||||
|
recv KEYWORD2
|
||||||
|
send KEYWORD2
|
||||||
|
rled_blink KEYWORD2
|
||||||
|
send_msg KEYWORD2
|
||||||
|
loop KEYWORD2
|
||||||
|
setcallback KEYWORD2
|
||||||
|
read_addr KEYWORD2
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Instances (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
#######################################
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
name= DLLN3X ZigBee Mesh Module Library
|
||||||
|
version= 1.0.0
|
||||||
|
author= Duke Liu <mentalflow@ourdocs.cn>
|
||||||
|
maintainer= Duke Liu <mentalflow@ourdocs.cn>
|
||||||
|
sentence= This library allows you to use DLLN3X ZigBee mesh module very easily.
|
||||||
|
paragraph= This library currently allows basic send and receive operations using the DLLN3X module, with more features to come.
|
||||||
|
category= Communication
|
||||||
|
architectures= *
|
||||||
|
includes= DLLN3X.h
|
||||||
|
license= MIT
|
Binary file not shown.
|
@ -0,0 +1,205 @@
|
||||||
|
#include "DLLN3X.h"
|
||||||
|
|
||||||
|
DLLN3X::DLLN3X(){}
|
||||||
|
DLLN3X::~DLLN3X() {}
|
||||||
|
|
||||||
|
void DLLN3X::init(HardwareSerial *DSerial)
|
||||||
|
{
|
||||||
|
_DSerial = DSerial;
|
||||||
|
_DSerial->begin(115200);
|
||||||
|
rled_blink();
|
||||||
|
_clear();
|
||||||
|
read_addr();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DLLN3X::_clear()
|
||||||
|
{
|
||||||
|
while (_DSerial->available())
|
||||||
|
_DSerial->read();
|
||||||
|
}
|
||||||
|
|
||||||
|
int DLLN3X::_pack(unsigned char buf[], unsigned char data[], int length)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
if (data[i] == 0xFE)
|
||||||
|
{
|
||||||
|
buf[count++] = data[i];
|
||||||
|
buf[count++] = 0xFC;
|
||||||
|
}
|
||||||
|
else if (data[i] == 0xFF)
|
||||||
|
{
|
||||||
|
buf[count++] = 0xFE;
|
||||||
|
buf[count++] = 0xFD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buf[count++] = data[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DLLN3X::_depack(unsigned char buf[], unsigned char data[], int length)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
if (buf[i] != 0xFE)
|
||||||
|
{
|
||||||
|
data[count++] = buf[i];
|
||||||
|
}
|
||||||
|
else if (buf[i + 1] == 0xFD)
|
||||||
|
{
|
||||||
|
data[count++] = 0xFF;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else if (buf[i + 1] == 0xFC)
|
||||||
|
{
|
||||||
|
data[count++] = 0xFE;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DLLN3X::recv(zigbee_frame *frame)
|
||||||
|
{
|
||||||
|
_recv_lock = true;
|
||||||
|
_DSerial->readBytesUntil(0xFF, (char *)frame, 64);
|
||||||
|
_DSerial->read();
|
||||||
|
_recv_lock = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DLLN3X::recv(unsigned char *orig_port,
|
||||||
|
unsigned char *dest_port, unsigned short *addr,
|
||||||
|
unsigned char data[], int *length)
|
||||||
|
{
|
||||||
|
_recv_lock = true;
|
||||||
|
unsigned char buf[200] = "";
|
||||||
|
unsigned char head = 0, tail = 0;
|
||||||
|
head = _DSerial->read();
|
||||||
|
if (head == 0xFE)
|
||||||
|
{
|
||||||
|
*length = _DSerial->read();
|
||||||
|
*length -= 4;
|
||||||
|
*orig_port = _DSerial->read();
|
||||||
|
*dest_port = _DSerial->read();
|
||||||
|
*addr = _DSerial->read();
|
||||||
|
*addr += _DSerial->read() << 8;
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < *length; i++)
|
||||||
|
{
|
||||||
|
buf[count++] = _DSerial->read();
|
||||||
|
if (buf[count-1]==0xFE)
|
||||||
|
{
|
||||||
|
buf[count++]=_DSerial->read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*length = count;
|
||||||
|
_DSerial->read(); // read pkg tail
|
||||||
|
*length = _depack(buf, data, *length);
|
||||||
|
_recv_lock = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_recv_lock = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DLLN3X::send(unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length)
|
||||||
|
{
|
||||||
|
if (orig_port<0x80)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned char send_buf[208] = {0xFE}, buf[200] = "";
|
||||||
|
unsigned char head = 0, buf_length = 0;
|
||||||
|
buf_length = _pack(buf, data, length);
|
||||||
|
send_buf[1] = length+4;
|
||||||
|
send_buf[2] = orig_port;
|
||||||
|
send_buf[3] = dest_port;
|
||||||
|
send_buf[4] = addr & 0xFF;
|
||||||
|
send_buf[5] = (addr & 0xFF00) >> 8;
|
||||||
|
memcpy(send_buf + 6, buf, buf_length);
|
||||||
|
send_buf[6 + buf_length] = 0xFF;
|
||||||
|
return _DSerial->write(send_buf, buf_length + 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DLLN3X::rled_blink(unsigned char orig_port, unsigned short addr, unsigned char time)
|
||||||
|
{
|
||||||
|
uint8_t gap = 5;
|
||||||
|
for (int i = 0; i < time; i += gap)
|
||||||
|
{
|
||||||
|
if (i%2!=0)
|
||||||
|
send(orig_port, 0x20, addr, &gap, 1);
|
||||||
|
else
|
||||||
|
delay(gap*100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short DLLN3X::read_addr()
|
||||||
|
{
|
||||||
|
if (self_addr!=0)
|
||||||
|
return self_addr;
|
||||||
|
unsigned char orig_port = 0xFF, dest_port = 0xFF;
|
||||||
|
unsigned char arg = 0x01;
|
||||||
|
unsigned short addr = 0xFFFF;
|
||||||
|
unsigned char data[60] = "";
|
||||||
|
int length = 0;
|
||||||
|
if (!_online)
|
||||||
|
{
|
||||||
|
_clear();
|
||||||
|
_online = true;
|
||||||
|
}
|
||||||
|
send(0x80, 0x21, 0x0000, &arg, 1);
|
||||||
|
recv(&orig_port, &dest_port, &addr, data, &length);
|
||||||
|
if (orig_port!=0x21||dest_port!=0x80||addr !=0x0000||length!=3||data[0]!=0x21)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->self_addr = data[1] + (data[2] << 8);
|
||||||
|
return this->self_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DLLN3X::send_msg(unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length, unsigned char orig_port)
|
||||||
|
{
|
||||||
|
return send(orig_port, dest_port, addr, data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DLLN3X::loop()
|
||||||
|
{
|
||||||
|
unsigned char orig_port = 0xFF, dest_port = 0xFF;
|
||||||
|
unsigned short addr = 0xFFFF;
|
||||||
|
unsigned char data[200] = "";
|
||||||
|
int length = 0;
|
||||||
|
if (_DSerial->available()>0&&!_recv_lock)
|
||||||
|
{
|
||||||
|
recv(&orig_port,&dest_port,&addr,data,&length);
|
||||||
|
Serial.print("Message: ");
|
||||||
|
for (int i = 0; i < length;i++)
|
||||||
|
{
|
||||||
|
Serial.printf("%X ", data[i]);
|
||||||
|
}
|
||||||
|
Serial.printf("at port %X from %X:%X\n", dest_port, addr, orig_port);
|
||||||
|
if (_callback!=nullptr)
|
||||||
|
_callback(orig_port, dest_port, addr, data, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DLLN3X::setcallback(void (*callback)(unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length))
|
||||||
|
{
|
||||||
|
_callback = callback;
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
#ifndef _DLLN3X_H_
|
||||||
|
#define _DLLN3X_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
typedef struct zigbee_frame
|
||||||
|
{
|
||||||
|
uint8_t length;
|
||||||
|
uint8_t src_port;
|
||||||
|
uint8_t dis_port;
|
||||||
|
uint8_t remote_addrL;
|
||||||
|
uint8_t remote_addrH;
|
||||||
|
uint8_t data[59];
|
||||||
|
}zigbee_frame;
|
||||||
|
|
||||||
|
#define new_zigbee_frame(num) \
|
||||||
|
struct \
|
||||||
|
{ \
|
||||||
|
uint8_t length; \
|
||||||
|
uint8_t src_port; \
|
||||||
|
uint8_t dis_port; \
|
||||||
|
uint8_t remote_addrL;\
|
||||||
|
uint8_t remote_addrH;\
|
||||||
|
uint8_t data[num]; \
|
||||||
|
}
|
||||||
|
|
||||||
|
class DLLN3X
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
void _clear();
|
||||||
|
bool _online = false, _recv_lock = false;
|
||||||
|
int _pack(unsigned char buf[], unsigned char data[], int length);
|
||||||
|
int _depack(unsigned char buf[], unsigned char data[], int length);
|
||||||
|
HardwareSerial *_DSerial;
|
||||||
|
void (*_callback) (unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length)=nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DLLN3X();
|
||||||
|
~DLLN3X();
|
||||||
|
void init(HardwareSerial *DSerial = &Serial1);
|
||||||
|
void recv(zigbee_frame *frame);
|
||||||
|
bool recv(unsigned char *orig_port,
|
||||||
|
unsigned char *dest_port, unsigned short *addr,
|
||||||
|
unsigned char data[], int *length);
|
||||||
|
bool send(unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length);
|
||||||
|
void rled_blink(unsigned char orig_port = 0x80,
|
||||||
|
unsigned short addr = 0x00, unsigned char time = 50);
|
||||||
|
bool send_msg(unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length, unsigned char orig_port = 0x80);
|
||||||
|
void loop();
|
||||||
|
void setcallback(void (*callback)(unsigned char orig_port,
|
||||||
|
unsigned char dest_port, unsigned short addr,
|
||||||
|
unsigned char data[], int length));
|
||||||
|
unsigned short read_addr();
|
||||||
|
unsigned short self_addr = 0x0000;
|
||||||
|
};
|
||||||
|
#endif
|
Loading…
Reference in New Issue