main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. func main() {
  11. const BrotherPort int = 54921
  12. BrotherIP := os.Args[1]
  13. resolution := os.Args[2]
  14. color := os.Args[3]
  15. if net.ParseIP(BrotherIP) == nil {
  16. fmt.Fprintf(os.Stderr, "Invalid IP address. Usage: %s <scanner ip>", os.Args[0])
  17. os.Exit(0)
  18. }
  19. log.Println("Valid IP address, opening socket...")
  20. conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", BrotherIP, BrotherPort))
  21. handleError(err)
  22. sendRequest(conn, resolution, color)
  23. defer conn.Close()
  24. }
  25. func sendRequest(conn net.Conn, _resolution string, _mode string) {
  26. reply := make([]byte, 128)
  27. resolution := checkResolution(_resolution)
  28. mode, compression := checkMode(_mode)
  29. log.Println("Reading scanner status...")
  30. _, err := conn.Read(reply)
  31. handleError(err)
  32. if "+OK 200" != string(reply[:7]) {
  33. handleError(fmt.Errorf("Invalid reply from scanner: %s", reply))
  34. }
  35. log.Println("Leasing options...")
  36. resp := []byte(fmt.Sprintf("\x1bI\nR=%d,%d\nM=%s\n\x80", resolution, resolution, mode))
  37. _, err = conn.Write(resp)
  38. handleError(err)
  39. _, err = conn.Read(reply)
  40. handleError(err)
  41. response := strings.Split(string(reply), ",")
  42. log.Println("Sending scan request...")
  43. scanRequestFormat := "\x1bX\nR=%v,%v\nM=%s\nC=%s\nJ=MID\nB=50\nN=50\nA=0,0,%v,%v\n\x80"
  44. resp = []byte(fmt.Sprintf(scanRequestFormat, response[1], response[1], mode, compression, response[5], response[6]))
  45. _, err = conn.Write(resp)
  46. handleError(err)
  47. }
  48. func checkResolution(_resolution string) int {
  49. resolution, err := strconv.Atoi(_resolution)
  50. if err != nil && resolution < 100 {
  51. resolution = 300
  52. }
  53. return resolution
  54. }
  55. func checkMode(_mode string) (string, string) {
  56. if _mode == "GRAY64" {
  57. return _mode, "NONE"
  58. } else {
  59. return "CGRAY", "JPEG"
  60. }
  61. }
  62. func handleError(err error) {
  63. if err != nil {
  64. log.Fatal(err)
  65. os.Exit(1)
  66. }
  67. }