ข้ามไปที่เนื้อหาหลัก

ทำ TP-Link TL-WA850RE v1.2 ลง OpenWrt ทำเป็น Range Extender และ auto login Hotspot (WISP Mode)

(ลอกคำพูด บทความเก่า)
สืบเนื่องจากได้รับการแจก Wifi Range Extender TP-Link TL-WA850RE มาเพื่อใช้กระจายสัญญาณ Wifi ของบ้านพัก ที่เป็น GPON

ปัญหาคือ TP-Link มันกากกกกกกกกกก..............มากกกกกกกกกกกกกก กล่าวคือ
1. ปัญหา ping กากกกกก.......... เริ่มใช้งานก็ดีอยู่ ping ไป Gateway ได้ ราว 5-10ms แต่พอใช้ไปสัก 3-4 ชม. มันจะ ping ขึ้นเป็น  400-500ms รู้สึกได้เพราะใช้ Remote Desktop ตลอด เม้าส์มันจะกระตุก ๆ ๆ ๆ จนน่ารำคาญ วิธีแก้แสนง่าย (แต่ไม่ยั่งยืน) คือ สั่ง reboot หรือ ชักปลั๊กเสียบใหม่
2. ปัญหาเนตตัด แน่นอน ระบบ authen พรบ.กำหนดว่า "ของมันต้องมี" ถึงแม้จะตั้งเวลา TimeOut ให้ถึง 24 ชม. แต่มันก็ไม่คล่องตัว เพราะติดกล้องวงจรปิดไว้ดูผ่านเนตตอนไม่อยู่บ้าน แต่พอจะดูกลับ "ดูไม่ได้" เพราะ "เน็ตตัด" ช่างเจ็บกระดองใจจริง ๆ

เรื่องเนตตัดที่บ้านก็มี Router LinkSys WRT-350N อยู่ซื้อตอนทำวิจัยปี 51 รูดปรื๊ดมาตั้ง 6500 (ตอนนี้เสียดายตังค์มาก) ซึ่งลง DD-WRT v24sp2 เรียบร้อย ตั้งใจจะทำ auto login แต่ดันมาตายจากไปเสียก่อน

ระหว่างพยายามหา Router Linksys WRT54GL ในตำนานมาทำ autologin ก็พยายามหา firmware เพื่อแก้ปัญหา ping กากของ TP-Link ด้วย ก็ไปเจอในเว็บ TP-Link Official ว่า WA-850E ตัวนี้ "สามารถลง OpenSource firmware ได้" สนานกันสิคราวนี้
TP-Link Official Site บอกว่าลง Third-party firmware ก็ได้นะ แต่ไม่รับประกันความปลอดภัย
ลองไปหาข้อมูลพบว่า OpenWRT มี firmware รับรอง แต่ DD-WRT ยังไม่มีอย่างเป็นทางการ ส่วนตัวคุ้นชินกับ DD-WRT มากกว่า แต่ก็เพิ่งจะรู้ว่า เดี๋ยวนี้ OpenWRT มี "Luci WEB GUI" ให้การตั้งค่าง่ายสะดวกมากขึ้น ไม่ต้องออกแรงอัด command line ล้วน ๆ อย่างแต่ก่อน

วิธีการลง firmware OpenWRT ให้ TP-Link ตาม คลิป เลย
วิธีการทำ Wireless Client (Range Extender) ตาม คลิป นี้

ปัญหาที่เกิดคือ ถ้าจะใช้เป็น Range Extender เราจะต้องใช้ DHCP server ของเดิมที่แจกในวง แต่ OpenWRT ดันมี dnsmasq ที่ทำหน้าที่เป็นทั้ง DHCP Server และ DNS Server ให้อยู่แล้ว แต่มันดันแจก IP ที่ให้ DNS เป็นของตัว TP-Link เอง ซึ่งทำให้มัน resolv name server ไม่ได้ (จะไม่มีปัญหาถ้าทำเป็น Router mode แต่ขี้เกียจมานั่ง NAT) และอีกปัญหาคือตัว DNSmasq มันจะไปแจก IP ชนกับ DHCP Server ของ GPON ตัวหลัก อาจทำให้เน็ตเวิร์ครวนได้

พยายามทำ DNS Forwarder กับ DNS Relay แล้ว ไม่รอด 😭

แนวทางแก้ปัญหาคือ ก็ใช้ DNSmasq เป็น DHCP Server นั่นแหละ แต่เลี่ยงไปแจก IP ช่วง 150-200 ที่หวังว่าจะไม่ชนแทน ตั้งค่าดังนี้

1. ไปที่เมนู Network -> Interface เลือก LAN แล้วกด Edit จะเข้าหน้า Interface LAN
ที่ ส่วนบน Common Configuration -> Tab General Setup -> Use custom DNS servers ให้ใส่ DNS ที่ถูกต้องเข้าไป มันจะไปบันทึกในไฟล์ /tmp/resolv.conf.auto
ตั้งค่า Use custom DNS servers
2. ที่ส่วนล่าง DHCP Server -> Tab General Setup -> Start ใส่ช่วง IP เริ่มต้นจ่าย DHCP โดยให้เริ่มที่หมายเลข 150 , Limit ใส่จำนวน IP ที่จะจ่าย ตั้งไว้สัก 50 น่าจะเหลือเฟือแล้ว , Leasetime ใส่เวลาที่จะขอคืน IP ก็ตามเดิม 12h = 12 ชั่วโมง
ตั้งช่วงจ่าย IP ของ DHCP
3. ที่ส่วนล่าง DHCP Server -> Tab Advance Settings -> DHCP-Option ให้ใส่ DNS Server ที่ถูกต้อง แต่ต้องใส่ตาม Pattern มัน ตามตัวอย่างใส่ 6, นำหน้า แล้วค่อยใส่ DNS Server <---- สำคัญมาก !!!
ตั้ง DHCP-Options เพื่อจ่าย DNS Server ที่ถูกต้องให้ DHCP client


4. อีกปัญหาคือตัว OpenWRT ถึงแม้จะยอมให้ตั้ง use Custom DNS แล้ว แต่ดันไม่ใช้ กลับไปใช้ DNS ที่ /etc/resolv.conf อย่างเคย วิธีแก้ง่าย ๆ คือไปเปลี่ยนค่าใน /etc/resolv.conf ซะให้ถูก แต่พอ reboot เครื่อง ค่าก็จะกลับมาเหมือนเดิม ทางแก้ง่าย ๆ ก็ตั้งให้มัน copy ไฟล์ /tmp/resolv.conf.auto ไปที่ /etc/resolv.conf ทุกครั้งที่มัน Startup ซะเลย ทำได้โดยไปที่เมนู System -> Startup ส่วน Local Startup ใส่คำสั่ง cp /tmp/resolv.conf.auto /etc/resolv.conf
ใส่ Startup Script เพื่อให้ router ใช้ Custom DNS ทุกครั้งที่ reboot
เบ็ดเสร็จเรียบร้อย DNS ทำงานถูกต้องทั้งตัว Repeater และ DHCP Client ที่นี้ก็ยัด Script Auto Login ได้แล้ว แนวทางก็ลอก "บทความเก่า" ได้เลย แต่เปลี่ยน URL ที่คำสั่ง wget นิดหน่อย ใส่ Script เพื่อสร้าง AutoLogin Script ที่ Local Startup เช่นกัน
ใส่ Startup Script เพื่อให้สร้าง Script Auto Login
ได้ Script Auto Login ทุกครั้งที่ Startup แล้ว ก็สั่งให้มันทำงานทุก ๆ 3 นาที โดยไปที่เมนู System -> Schedule Task แล้วใส่ Script Crontab ตามภาพ
ใส่ script แบบ DD-WRT ใช้ไม่ได้กับ OpenWRT

[แก้ไข 15/4/61 0935]
ไปเจอว่า Script Auto Login ไม่ทำงานเช็คดู Crontab ก็ทำงานให้ตามปกติ ลองรัน script autologin ที่ shell เองก็ทำงานได้ปกติ หาข้อมูลไปเจอ ลิงก์นี้ เป็นอาการเดียวกัน สรุปว่า ใช้ Script Cron แบบ DD-WRT ไม่ได้ ต้องเขียนใหม่แบบของ OpenWRT ถึงจะทำงานได้ แก้ไขโดยการเอาคำว่า "root" ออก ก็ใช้ได้แล้ว
ใส่ Script Cron แบบ "OpenWRT เท่านั้น!!!" เพื่อให้ autologin ทำงานทุก 2 นาที



[จบ แก้ไข]
ตอนนี้ลองมา 3 วันก็ถือว่านิ่งมีช่วงแรก ๆ ที่ ping ไป gateway มา ๆ หาย ๆ

[เพิ่มเติม 17/4/61 2324]
และแล้ว อาการ ping กากกกก..... Ping Time AVG > 400ms ก็กลับมา คงไม่เกี่ยวกับ firmware แล้วล่ะ เลยต้องหาวิธีแก้ ก็ใส่ script ไปง่าย ๆ เลยว่า ถ้า AVG ping time เกิน 350 ก็ให้ reboot เครื่องไปเลยแล้วกัน
เพิ่ม script เช็ค AVG ping time ถ้าเกิน 350 เมื่อไร ให้ reboot router โลด

[จบ เพิ่มเติม]

ป.ล. ตามคุณลักษณะโปรแกรมเมอร์ที่ดี จะต้องพัฒนาตัวเองอย่างสม่ำเสมอ ถ้าไม่เปลี่ยนภาษาก็เปลี่ยนเทคนิคการเขียนใช้ท่าใหม่ ๆ เห็นมี Script Auto Login ที่ใช้ curl ก็อยากลองใช้บ้าง แต่ใน busybox ไม่มี curl ให้ใช้ เลยถอยเพราะกระทบเวลางานหลักอื่นๆ มามากเกินไปแล้ว

กว่าจะเขียนจบได้ปาไป 3 วัน เริ่มเขียนทีไร ลูกกวนทุกที ไม่เหมือนเมื่อก่อนสมัยยังโสดทำรวดเดียวเสร็จ

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

C# Databinding เทคนิคกรอง combobox OrderNo ที่มีการ Invoice แล้ว (How to refresh OrderNo list in combobox binding after invoiced without left outer join method)

เขียนโปรแกรมรับ Order และจ่าย Invoice เงื่อนไขคือ OrderNo จะต้องแสดงเฉพาะ OrderNo ที่ยังไม่ได้ผูกกับ Invoice เท่านั้น วิธีการที่เคยทำได้แก่ 1. ทำ Orders Left Outer Join Invoice เอาเฉพาะ Order ที่ยังไม่มีเลข Invoice ออกมา (ตามตำรา) - ถ้าไม่เขียน sql query ตอนสั่ง sqlselect command ก็ต้องไปใช้ LINQ to Object แล้วเอามา rebinding combobox.datasource ใหม่ เพราะ datasource ที่ผูกไว้กับ combobox มันไม่ refresh เช่น cboOrderNo.datasource.Clear; cboOrderNo.datasource = newList(); 2. เพิ่ม flag field ที่ table Orders ถ้ามีรับ invoice แล้ว ให้ flag = 1 แล้วใช้ dtOrder.defaultview.rowfilter = "flag=1"; ข้อมูลใน combobox จะไม่ต้อง rebinding อันนี้เห็นมาจากระบบอื่น 3. ใช้ Rowfilter = "Child(relation).Order = null" แต่วิธีนี้ใช้ไม่ได้ เพราะ Rowfilter จำกัดให้ใช้ได้เฉพาะ Parent เพราะถ้าเป็น Child แล้วจะ return หลายตัว ตามข้อมูลจาก link นี้ แต่อ้างอิงเป็นกลุ่มเช่น Sumchild(relation).Qty >20 ได้ เห็นแล้วก็นึกถึงไอเดียบรรเจิด ใช้ Rowfilter = Count(Child(relation)) <0 แ...

เทคนิคการสอบใบขับขี่รถยนต์ ท่าจอดรถเทียบฟุตบาทห่างไม่เกิน 25cm ด้วย "Sticker"

วันนี้พาพี่ที่บ้านไปสอบใบขับขี่รถยนต์ครั้งที่ 3 ซึ่งสอบตกท่าจอดรถเทียบฟุตบาท โดยคนขับรถเป็นแล้วจะรู้สึกว่าไม่เห็นจะยากตรงไหน แต่สำหรับคนที่เพิ่งหัดขับรถ ประกอบกับได้จับรถป้ายแดงที่เพิ่งถอยออกมาขับได้ ไม่ถึง 5 ชม. นั้นเป็นเรื่องที่ยากจะทำได้ ผมคนหนึ่งที่ได้ใบขับขี่มานาน แต่พอให้มาขับจอดเทียบฟุตบาทด้วยรถป้ายแดงใหม่เอี่ยมของคนอื่นแล้ว มีอันต้องจอดห่างทุกที ด้วยเวลาในการซ้อมขับที่เหลือไม่ถึง 3 ชม. ก่อนสอบจริง ทำให้ต้องคิดหาเทคนิควิธีต่าง ๆ ที่จะทำได้ใบขับขี่มา (เพราะเหนื่อยกับความพยายามสอบมา 2 ครั้งแล้ว) จนทำให้คิดเทคนิค "Sticker" นี้ขึ้นได้ โดยปกติแล้วถ้าขับรถจอดเทียบฟุตบาทแล้วพยายามมองกระจกข้างให้ล้อหลังชิดเส้นขอบพอดี ผลออกมาจะทำให้ล้อหน้าปีนฟุตบาท ไอ้ครั้นจะให้พี่ที่เพิ่งหัดขับรถมาได้ไม่ถึง 8 ชม. กะขนาดตัวรถให้ได้ (ซึ่งขนาดผมเองยังคงกะลำบาก) ภายในสิบห้านาทีนั้นโอกาสเป็นไปได้ยากมาก ด้วยการทดลองเทคนิคต่าง ๆ หลาย ๆ แบบ ที่พอจะนึกออกจากประสบการณ์และเวลาอันสั้นรวบรัด ก็ทำให้เกิดแนวคิดที่ว่า ทำอย่างไรให้สามารถมองล้อหน้าว่าติดเส้นขอบหรือเปล่า ได้เหมือนกับที่ใช้กระจก...

เขียนโปรแกรม Visual Studio 2008(.NETCF3.5) กับ Windows Mobile 6 ติดต่อกับ Database MSSQL Server 2008 โดยตรง (ไม่ได้ใช้ SQLCE)

รับ Requirement ให้เขียนโปรแกรมบน Windows Mobile 6 ติดต่อกับ Database MSSQL Server 2008 โดยตรง ตอนแรกก็ลองใช้ SQLCE แต่เท่าที่ดูมันไม่ได้เชื่อมต่อ กับ Database Server แต่มันใช้ Database ในเครื่อง Pocket PC แทน ซึ่งไม่ตรงกับ Requirement นัก เลยลองเขียนโปรแกรมเชื่อมต่อไปยัง SQL Server ตรง ๆ กับปรากฏว่า import System.data.SqlClient ไม่ได้ หาไปหามา พบว่า SqlClient มันอยู่ในไฟล์ System.Data ใน VS2008 ซึ่งถ้าใช้ .NETCF 3.5 มันไม่มีให้ใช้ ลองถามอากู๋ดูก็พบว่ามีคนเขียนแล้วใช้ได้ เลยสงสัยว่าใช้ได้ยังไง หมดไป 1 วันก็พบว่าเขา Add Reference file "System.data.SqlClient.dll" มาใช้กัน ซึ่งเป็นของ "VS2005" ถ้าเป็น VS2008 มันเอาไปรวมใน System.Data.dll แล้ว หมดสิทธิ์ใช้งานนะจ๊ะ ครั้นลองเอา System.data.dll ของ .NET framework ตัวเต็มมา Add ใส่แทนที่ ผลปรากฏว่าพังไม่เป็นท่าเลย หลังจากถอดใจแล้วผลอยหลับไปงีบ ตื่นมาก็อาศํยสิ่งศักดิ์สิทธิ์เสียหน่อย ท่องคาถาให้งานราบรื่น ปรากฏว่า "สิ้งศักดิ์สิทธิ์มีจริง ไม่เชื่ออย่าลบหลู่" ไปเจอ Link (ลิงก์พังแล้ว) นี้   ซึ่งม...