Zigbee API Frame (Zigbee API Packet)

วันนี้ขอมาบันทึกอะไรนิดๆหน่อยๆแล้วกัน จะถือว่าเป็นประโยชน์ให้กับคนอื่น เพราะว่าเห็นคนทำน้อยเหลือเกิน

ไหนๆก็ทำโปรเจ็กต์เรื่องนี้โดยตรง อยู่แล้ว แบ่งปันให้คนอื่นรู้มั่ง…

ของผมเป็น โมดูล Xbee Series2 จำนวน 3 ตัว และ Xbee-Pro Series2 จำนวน 1 ตัว

เรื่องแรกวันนี้ ของการเซ็ตค่า API

สำหรับโปรเจ็กต์ครึ่งปีแรกนี้ คือในโปรเจ็กต์ จะมี xbee ตอนนี้อยู่ 4 ตัว

1. ทำหน้าที่เป็น Coordinator 1 ตัว ต่ออยู่กับ ARM7 Cortex-M3

2. ทำหน้าที่เป็น Router 3 ตัว

ในส่วนของ Router นั้น สามารถแบ่งออกเป็น 3 แบบดังนี้

1. ไม่ได้ทำอะไรเลย เป็นทางผ่านส่งข้อมูลเฉยๆ 1 ตัว

2. เซ็ตค่า Pin Change Detection จำนวน 1 ตัว หน้าที่ของโหนดนี้คือ ต่ออยู่กับ PIR Sensor เวลามีอะไรผ่านหน้าเลนส์ จะยก logic ให้เป็น High เมื่อ logic เปลี่ยนก็จะทำการส่งข้อมูล API Frame ผ่าน Router ข้อ 1 ไปยัง Coordinator

3. รับค่าค่า Analog Input ทุกๆ 20 วินาที เพื่อส่งเป็น API Frame กลับไปยัง Coordinator

ในส่วนของ Coordinator นั้น ต่อกับ ARM7 ผ่านทาง UART (RS232) เมื่อรับค่าเข้ามาเป็น Packet หลักการของโปรแกรมใน ARM ทำดังนี้

หลักการเช็คข้อมูล Packet ที่ได้รับจาก Zigbee API Frame

1. รับค่า UART แล้วทำการเก็บใน DMA เพื่อหาจำนวน Bytes ทั้งหมด ว่ามีทั้งหมดกี่ bytes

2. ตรวจสอบ byte แรก ต้องเป็น 0x7E

3. byte 2-3 นั้นจะเป็นค่าความยาว Length ของขบวนข้อมูลที่รับมา ซึ่งจะสัมพันธ์กับ Bytes ทั้งหมด ที่อยู่กับด้านบน

4.ทำการตรวจสอบ byte ที่ 4 ว่าเป็น 0×92 รึเปล่า ถ้าใช่ จะเป็น Zigbee IO Data Sample RX Indicator ซึ่งเป็นการแซมปลิ้งค่าจาก Digital Input ทุกขา ของ โมดูล Xbee ซึ่งอาจจะเป็นเลขรหัสอื่น ซึ่งการตีความใน API Frame ก็จะแตกต่างกันไป แต่ในโครงงานนี้ ตีความโดย 0×92

5. ทำการบวกเลขทั้งหมด ตั้งแต่ byte ที่ 4 จนถึง byte ก่อน checksum ทั้งหมด แล้วหักด้วย 0xFF ซึ่งค่าที่ได้ byte low จะอยู่ในส่วนของ checksum (เวลาคำนวณให้ตัด byte high ออกไปได้เลย)

6. ถ้าถูกต้องทั้งหมดใน 5 ข้อที่กล่าวมาข้างต้น แสดงว่า ส่งข้อมูลรูปแบบ API Frame ถูกต้องแล้ว ให้ไปทำอะไรก็ได้หลังจากนี้

ตัวอย่าง ซึ่งเช่นข้อมูลเป็นดังนี้ (รับค่า Pin Change Detection อย่างเดียว ถูกส่งจากโหนด มายัง Coordinator) ถ้าเป็น Analog ด้วย Packet จะยาวกว่านี้ แต่สามารถส่งรวมกันได้เลยนะ

7E 00 12 92 00 13 A2 00 40 3D C7 1D 40 CB 01 01 FF FF 00 00 01 4B

เวลาตีความ จะสามารถตตีความได้ดังนี

0x7E คือ byte start ของข้อมูลขบวนรถไฟที่ถูกส่งมา

0×00 0×12 คือ จำนวน bytes ทั้งหมดตั้งแต่ byte ที่ 4 จนถึง byte ก่อนหน้า checksum ซึ่ง 0×12 แปลงเป็นฐานสิบได้ 18 ซึ่งถูกต้อง ลองนับดู (ตัวอักษรสีฟ้า)

7E 00 12 92 00 13 A2 00 40 3D C7 1D 40 CB 01 01 FF FF 00 00 01 4B

ได้ครบ 18 ตัวจริงๆด้วยอ่ะนะ…

0×92 คือ API Frame นี้ถูกส่งมาโดยข้อมูลที่ตามมาเป็น Zigbee IO Data Sample RX Indicator

0×00 0×13 0xA2 0×00 0×40 0x3D 0xC7 0x1D คือ 0013A200 403DC71D ซึ่งเป็น DH และ DL Address 64bit ของโหนดปลายทางที่ส่งข้อมูลมา (ระบุตัวตนของโหนดที่ส่งข้อมูลมา)

0×40 0xCB คือ 16bit Address อันนี้ไม่ต้องสนใจ เนื่องจากเราเช็คผ่าน 64 bit address ไปแล้ว

0×01 (byte ที่ 15) คือ Packet ACK คือ ปรกติจะมี ACK กะ NACK อ่ะนะ แปลง่ายๆ Acknowledge นั่นเอง

0×01 (byte ที่ 16) คือ Number sample sets โดยปกติแล้วจะเป็นค่านี้ตลอด

0xFF 0xFF คือ Digital Channel Mask ก็คือถ้า สอง byte นี้ มีค่าเป็น FF FF แสดงว่ามีการส่งค่าดิจิตอล Input มา ถ้าเป็น 00 00 ก็แสดงว่าไม่มีการส่งค่าดิจิตอล Input มา

0×00 (byte ที่ 19) Analog Channel Mask คือถ้าเป็น 00 แสดงว่าไม่มีการส่งค่า analog มา ถ้ามีการส่งค่า analog มา มันจะมีค่าเป็น FF

0×00 0×01 (byte ที่ 20 และ 21) อันนี้เป็น RAW Data จริงๆ คือ มันมีทั้งหมด 2byte (รองรับ 16bit) สำหรับดิจิตอล แต่จริงๆ โมดูล xbee มีไม่ถึงนะ ปกติมีแค่ 12bit โดยเรียงขาดังนี้

bit12         bit11         bit10         bit9         bit8         bit7         bit6         bit5         bit4         bit3         bit2         bit1         bit0

DIO12      DIO11      DIO10       N/A        N/A       DIO7      DIO6      DIO5      DIO4      DIO3      DIO2      DIO1       DIO0

เช่นค่าที่ได้มา 00 01 ก็จะเป็น

0             0               0               0              0              0              0               0             0               0               0              0              1

แสดงค่า DIO0 ที่ต่ออยู่กับ PIR Sensor Detect ค่าได้ว่าเป็น 1 นั่นเอง…

ต่อมา…

0x4B คือค่า Check Sum ซึ่งหาได้จาก

Check Sum = 0xFFFF – ( 0×92 + 0×00 + 0×13 + 0xA2 + 0×00 + 0×40 + 0x3D + 0xC7 + 0x1D + 0×40 + 0xCB + 0×01 + 0×01 + 0xFF + 0xFF + 0×00 + 0×00 + 0×01 )

Check Sum = 0xFFFF – 0x5B4

Check Sum = 0xFA4B ซึ่ง byte high เราไม่เอา เอาแต่ byte low ก็จะได้ 4B ดัง Packet สุดท้ายที่มันส่งมา

จบแล้ว ง่ายมั๊ย ศึกษามา 3-4 เดือน = =’ โปรเจ็กต์ยังไม่ไปไหน ฮ่าๆ

วันนี้ขอแค่นี้ก่อนละกัน รู้สึกเมื่อยๆ ^^

เมื่อคืนได้เข้าไปที่บล๊อก http://www.10logic.com/ มา พอดีสนในเรื่อง gsm module เลยไปขอวงจรจากพี่เค้ามาครับ

ไม่ถึงวัน พี่เค้าส่งให้เลย ต้องขอขอบคุณพี่ B.Uthen มากๆเลยนะครับ ที่อนุเคราะห์ให้

ซาบซึ่งๆ ^^

2 thoughts on “Zigbee API Frame (Zigbee API Packet)
Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>